package com.iotmonitor.iot.mapper;

import com.iotmonitor.common.datasource.annotation.Slave;
import com.iotmonitor.iot.api.domain.FieldsVo;
import com.iotmonitor.iot.api.domain.SelectDto;
import com.iotmonitor.iot.api.domain.TableDto;
import com.iotmonitor.iot.api.domain.TagsSelectDao;
import com.iotmonitor.iot.api.domain.visual.SelectVisualDto;
import com.iotmonitor.iot.domain.dto.*;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;

/**
 * @ClassDescription:
 * @ClassName: TdEngineMapper
 * @Author: thinglinks
 * @Date: 2021-12-27 14:52:34
 * @Version 1.0
 */
@Slave
public interface TdEngineMapper {

    /**
     * @param dataBaseName 数据库名称
     * @MethodDescription 创建tdEngine数据库
     */
    void createDatabase(@Param("dataBaseName") String dataBaseName);


    void createSuperTable(@Param("schemaFields") List<FieldsVo> schemaFields,
                          @Param("tagsFields") List<FieldsVo> tagsFields,
                          @Param("dataBaseName") String dataBaseName,
                          @Param("superTableName") String superTableName);

    /**
     * @param tableDto 创建超级表的子表需要的入参的实体类
     * @MethodDescription 创建超级表的子表
     */
    void createTable(TableDto tableDto);

    /**
     * @param tableDto 插入数据需要的入参的实体类
     * @MethodDescription 插入数据
     * @author thinglinks
     * @Date 2022/1/10 14:44
     */
    void insertData(TableDto tableDto);

    List<Map<String, Object>> selectByTimestamp(SelectDto selectDto);

    /**
     * 添加列字段
     *
     * @param superTableName
     * @param fieldsVo
     * @return
     */
    void addColumnForSuperTable(@Param("superTableName") String superTableName,
                                @Param("fieldsVo") FieldsVo fieldsVo);

    /**
     * 删除列字段
     *
     * @param superTableName
     * @param fieldsVo
     * @return
     */
    void dropColumnForSuperTable(@Param("superTableName") String superTableName,
                                @Param("fieldsVo") FieldsVo fieldsVo);

    void addTagForSuperTable(@Param("superTableName") String superTableName,
                                @Param("fieldsVo") FieldsVo fieldsVo);

    void dropTagForSuperTable(@Param("superTableName") String superTableName,
                                 @Param("fieldsVo") FieldsVo fieldsVo);

    Map<String, Long> getCountByTimestamp(SelectDto selectDto);

    /**
     * 检查表是否存在
     * @param dataBaseName
     * @param tableName 可以为超级表名或普通表名
     * @return
     */
    Integer checkTableExists(@Param("dataBaseName") String dataBaseName, @Param("tableName")String tableName);

    /**
     * 查询最新的数据
     * @param selectDto
     * @return
     */
    List<Map<String, Object>> getLastData(SelectDto selectDto);

    List<Map<String, Object>> getHistoryData(SelectVisualDto selectVisualDto);

    List<Map<String, Object>> getRealtimeData(SelectVisualDto selectVisualDto);

    List<Map<String, Object>> getAggregateData(SelectVisualDto selectVisualDto);

    /**
     * 查询最新的数据带标签
     * @param tagsSelectDao
     * @return
     */
    List<Map<String, Object>> getLastDataByTags(TagsSelectDao tagsSelectDao);

    Integer addQuotaInfo(QuotaInfo quotaInfo);

    List<QuotaInfo> selectQuotaList(@Param("alarmName") String alarmName, @Param("deviceId") String deviceId, @Param("startTime") String start, @Param("endTime") String end);

    List<Map<String, Object>> getLastQuotaList(String deviceId);

    List<TrendPoint> getAlarmTrend(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("type") String type);

    List<HeapPoint> getTop10Alarm(@Param("startTime") String startTime, @Param("endTime") String endTime);

    List<QuotaInfo> getDeviceByQuota(String quotaId);

    List<TrendPoint2> getQuotaTrend(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("quotaId") String quotaId, @Param("deviceId") String deviceId, @Param("type") String type);

    List<QuotaInfo> getLastDataByDeviceIdAndAlarmName(@Param("deviceId") String deviceId,@Param("alarmName") String alarmName);
}
